import java.io.*;
import java.util.Arrays;

/**
 * @Auther: MFM
 * @Date: 2022/3/12 - 03 - 12 - 8:42
 * @version: 1.0
 */

public class sparseArr {
    public static void main(String[] args) throws Exception {
        //创建一个11*11的原始二维数组
        //0 无子 1 黑子 2白子
        int[][] chessArr1 = new int[11][11];
        chessArr1[1][2] = 1;
        chessArr1[2][3] = 2;
        //输出原始数组
        for (int[] arr : chessArr1) {
            for (int data : arr) {
                System.out.print(data + " ");
            }
            System.out.println();
        }

//        //把原始数组 转换为 稀疏数组
//        System.out.println();
//        int[][] arr = ArrChange(chessArr1);
//        for (int i = 0; i < arr.length; i++) {
//            System.out.println(Arrays.toString(arr[i]));
//        }
//
//        //把稀疏数组 转换为 原始数组
//        System.out.println();
//        int[][] ints = ArrChanges(arr);
//        for (int i = 0; i < ints.length; i++) {
//            System.out.println(Arrays.toString(ints[i]));
//        }
//        save(chessArr1);

        String[] load = load();
        for (int i = 0; i <  load.length;i++) {
            System.out.println(load[i]);
        }

    }

    //二维数组 转 稀疏数组
    public static int[][] ArrChange(int[][] arr) throws Exception {
        if (arr == null) {
            throw new Exception("传入二维数组错误");
        }
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    sum++;
                }
            }
        }

        //创建对应的稀疏数组
        int[][] sparseArr = new int[sum + 1][3];
        //00 是行数 01 是列数 02 是有效数据数
        sparseArr[0][0] = arr.length;
        sparseArr[0][1] = arr[0].length;
        sparseArr[0][2] = sum;

        //遍历二维数组，将非零的值存放到稀疏数组中
        sum = 0;//用来记录是第几个非零数据
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != 0) {
                    sum++;
                    sparseArr[sum][0] = i;
                    sparseArr[sum][1] = j;
                    sparseArr[sum][2] = arr[i][j];

                }
            }
        }
        return sparseArr;
    }

    //稀疏数组 转 二维数组
    public static int[][] ArrChanges(int[][] arr) throws Exception {
        if (arr == null) {
            throw new Exception("传入稀疏数组错误");
        }

        //读取行数和列数 创建新数组
        int row, col;
        row = arr[0][0];
        col = arr[0][1];
        int[][] sparseArr = new int[row][col];

        //先用0把新建的二维数组填满
        for (int[] arr1 : sparseArr) {
            for (int a : arr1) {
                a = 0;
            }
        }

        //根据稀疏数组中的坐标 将值放回原位
        for (int i = 1; i < arr.length; i++) {
            sparseArr[arr[i][0]][arr[i][1]] = arr[i][2];
        }

        return sparseArr;
    }

    //扩充 将转换后的 稀疏数组 存入磁盘
    public static void save(int[][] arr) throws Exception {
        if (arr == null) {
            throw new Exception("数组为空");
        }

        //开启字符输出流
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("./JavaDataStruct/NewFile/data.txt"));

        for (int i = 0; i < arr.length; i++) {
            String s = Arrays.toString(arr[i]);
            osw.write(s + "\n");
        }

        osw.close();
    }

    //扩充 读取磁盘中的 稀疏数组 并 转换为 二维数组 进行读取
    public static String[] load() throws Exception {
        String[] arr = null;

        //开启字符输入流
       RandomAccessFile raf = new RandomAccessFile(new File("./JavaDataStruct/NewFile/data.txt"),"r");

        arr = new String[11];

        for (int i = 0; i < 11; i++) {
            arr[i] = raf.readLine();
        }

        if (arr == null) {
            throw new Exception("读取错误，数组为空");
        }

        return arr;
    }

}
